package E_2024;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/*
    在一个博客网站上，每篇博客都有评论。每一条评论都是一个非空英文字母字符串。评论具有树状结构，除了根评论外，每个评论都有一个父评论。
    当评论保存时，使用以下格式:
    首先是评论的内容;
    然后是回复当前评论的数量。
    最后是当前评论的所有子评论。(子评论使用相同的格式嵌套存储)
例如:
    第—条评论是"hello,2,ok,0,bye,0" ,
    第二条评论是"test,0" ,
    第三条评论是"one,1 ,two,1,a,0"
    所有评论被保存成"hello,2,ok,0,bye,0,test,0,one,1,two,1,a,0"。对于上述格式的评论，请以另外—种格式打印:
    首先打印评论嵌套的最大深度。
    然后是打印n行，第(1<=i<=n)行对应于嵌套级别为i的评论(根评论的嵌套级别为1)。按照它们出现的顺序打印，用空格分隔开。
输入描述:
    1行评论。由英文字母、数字和英文逗号组成。保证每个评论都是由英文字符组成的非空字符串。每个评论的数量都是整数(至少由一个数字组成)。整个字符串的长度不超过106.给定的评论结构保证是合法的。
输出描述
    按照给定的格式打印评论。对于每一级嵌套，评论应该按照输入中的顺序打印
示例1
    输入:
    hello,2,ok,0,bye,0,test,0,one,1,two,1,a,0
    输出:
    3
    hello test one
    ok bye two
    a
 */
public class E_200_5 {
    public static void main(String[] args) {
        String x = "hello,2,ok,0,bye,0,test,0,one,1,two,1,a,0";
        String[] str = x.split(",");
        List<StringBuffer> list = new ArrayList<>();
        int index = 0;
        // 判断是否所有值都执行
        while(index < str.length) {
            index = ans(str, list, index, 0);
            // 每次判断都是一个评论，一个子评论数量，因此下标需要 +2
            index += 2;
        }
        for (StringBuffer buffer : list) {
            System.out.println(buffer);
        }
    }
    public static int ans(String[] str, List<StringBuffer> map, int index, int parent){
        String temp = str[index];
        // 当前评论有多少子评论
        int num = Integer.parseInt(str[index + 1]);
        StringBuffer sb ;
        if (parent >= map.size()) {
            sb = new StringBuffer();
            sb.append(temp);
            map.add(sb);
        }else {
            sb = map.get(parent);
            sb.append(" ").append(temp);
        }
        // 循环获取子评论
        while (num > 0){
            index = ans(str,map,index + 2,parent + 1);
            num--;
        }
        // 返回已经判断过的数组下标
        return index;
    }
}
